package wiki.zimo.dao;

import org.apache.commons.dbutils.QueryRunner;
import wiki.zimo.utils.DataSourceUtils;

import java.util.List;

/**
 * @version v1.0
 * @auther: 子墨
 * @datetime: 2018/10/31 15:18
 * @description: 抽取Dao接口，所有的Dao操作都应该遵守这个规范
 */
public interface Dao<T, E> {

    QueryRunner qr = new QueryRunner(DataSourceUtils.getDataSource());

    /**
     * @auther: 子墨
     * @date: 2018/10/31 15:20
     * @describe: 插入保存实体信息到数据库
     * @param: [entity]
     * @return: T
     * @version v1.0
     */
    T insert(T entity) throws Exception;

    /**
     * @auther: 子墨
     * @date: 2018/10/31 15:21
     * @describe: 从数据库中删除实体数据
     * @param: [entity]
     * @return: boolean
     * @version v1.0
     */
    boolean delete(T entity) throws Exception;

    /**
     * @auther: 子墨
     * @date: 2018/10/31 15:23
     * @describe: 更新实体信息到数据库
     * @param: [entity]
     * @return: T
     * @version v1.0
     */
    T update(T entity) throws Exception;

    /**
     * @auther: 子墨
     * @date: 2018/10/31 15:24
     * @describe: 通过id查找对应实体信息
     * @param: [id]
     * @return: T
     * @version v1.0
     */
    T findOneById(E id) throws Exception;

    /**
     * @auther: 子墨
     * @date: 2018/10/31 16:25
     * @describe: 利用Java可变参数类型实现多个参数查询实体信息
     * @param: [params]
     * @return: T
     * @version v1.0
     */
    @SuppressWarnings("unchecked")
    T findOneByParams(E... params) throws Exception;

    /**
     * @auther: 子墨
     * @date: 2018/10/31 15:25
     * @describe: 查询所有信息
     * @param: []
     * @return: java.util.List<T>
     * @version v1.0
     */
    List<T> findAll() throws Exception;

    /**
     * @auther: 子墨
     * @date: 2018/11/4 13:35
     * @describe: 统计数目
     * @param: []
     * @return: int
     * @version v1.0
     */
    int count() throws Exception;
}
